#!/bin/bash

# Pansftp 安装脚本
# 支持 Linux (Ubuntu 22.04, 24.04), Unix, macOS 和 Windows (通过 Git Bash/WSL)
# 项目地址: https://gitee.com/solomonxu/pansftp

set -e  # 遇到错误退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色

# 输出带颜色的文本
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查运行环境
check_environment() {
    log_info "检查运行环境..."
    
    # 检查是否在Windows上运行但没有使用Git Bash/WSL
    if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then
        log_warning "检测到Windows系统"
        log_warning "建议使用Git Bash或WSL运行此脚本"
        read -p "是否继续? (y/N): " continue_install
        if [[ ! "$continue_install" =~ ^[Yy]$ ]]; then
            exit 1
        fi
    fi
    
    # 检查必要的工具
    local missing_tools=()
    for tool in curl unzip; do
        if ! command -v $tool &> /dev/null; then
            missing_tools+=("$tool")
        fi
    done
    
    if [ ${#missing_tools[@]} -ne 0 ]; then
        log_error "缺少必要工具: ${missing_tools[*]}"
        log_info "请先安装这些工具后再运行脚本"
        exit 1
    fi
    
    log_success "环境检查通过"
}

# 检查Python环境
check_python() {
    log_info "检查Python环境..."
    
    local python_cmd=""
    local python_version=""
    
    # 尝试查找Python命令
    for cmd in python3 python; do
        if command -v $cmd &> /dev/null; then
            python_cmd=$cmd
            python_version=$($cmd -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')" 2>/dev/null || echo "")
            break
        fi
    done
    
    if [ -n "$python_cmd" ] && [ -n "$python_version" ]; then
        log_success "找到Python: $python_cmd (版本 $python_version)"
        return 0
    else
        log_warning "未找到合适的Python安装"
        return 1
    fi
}

# 安装Python
install_python() {
    log_info "尝试安装Python..."
    
    local os_type=$(uname -s)
    
    case $os_type in
        Linux*)
            if command -v apt-get &> /dev/null; then
                log_info "检测到Debian/Ubuntu系统，使用apt安装Python"
                sudo apt-get update
                sudo apt-get install -y python3 python3-pip
            elif command -v yum &> /dev/null; then
                log_info "检测到RHEL/CentOS系统，使用yum安装Python"
                sudo yum install -y python3 python3-pip
            else
                log_error "不支持的Linux发行版，请手动安装Python 3.7+"
                exit 1
            fi
            ;;
        Darwin*)
            log_info "检测到macOS系统"
            if command -v brew &> /dev/null; then
                brew install python3
            else
                log_error "请先安装Homebrew，或手动从https://www.python.org/downloads/安装Python"
                exit 1
            fi
            ;;
        *)
            log_error "不支持的操作系统: $os_type"
            log_info "请手动从https://www.python.org/downloads/安装Python 3.7+"
            exit 1
            ;;
    esac
    
    # 验证安装
    if check_python; then
        log_success "Python安装成功"
    else
        log_error "Python安装失败"
        exit 1
    fi
}

# 安装Python依赖
install_dependencies() {
    log_info "安装Python依赖..."
    
    local python_cmd=""
    for cmd in python3 python; do
        if command -v $cmd &> /dev/null; then
            python_cmd=$cmd
            break
        fi
    done
    
    if [ -z "$python_cmd" ]; then
        log_error "未找到Python命令"
        exit 1
    fi
    
    # 创建虚拟环境（可选）
    log_info "创建虚拟环境..."
    $python_cmd -m venv "$INSTALL_DIR/venv"
    source "$INSTALL_DIR/venv/bin/activate"
    
    # 安装依赖
    if [ -f "$INSTALL_DIR/requirements.txt" ]; then
        pip install -r "$INSTALL_DIR/requirements.txt"
        log_success "Python依赖安装完成"
    else
        log_warning "未找到requirements.txt文件，跳过依赖安装"
    fi
}

# 下载并解压工具
download_and_extract() {
    log_info "下载pansftp..."
    
    local temp_zip="/tmp/pansftp.zip"
    local download_url="https://gitee.com/solomonxu/pansftp/repository/archive/master.zip"
    
    # 下载ZIP文件
    if curl -L -o "$temp_zip" "$download_url"; then
        log_success "下载完成"
    else
        log_error "下载失败"
        exit 1
    fi
    
    # 创建安装目录
    mkdir -p "$INSTALL_DIR"
	
    # 创建临时解压目录
    local temp_extract=$(mktemp -d)
    
    # 解压ZIP文件
    log_info "解压到 $temp_extract..."
    if unzip -q "$temp_zip" -d "$temp_extract"; then
        # 通常Gitee的ZIP会包含一个带分支名的目录，我们需要移动内容
        local package_dir=$(find "$temp_extract" -maxdepth 3 -type d -name "pansftp*" | tail -1)
        if [ -z "$package_dir" ]; then
            package_dir=$temp_extract
        fi
        shopt -s dotglob && mv "$package_dir"/* "$INSTALL_DIR/" && rm -r "$temp_extract"
        log_success "解压完成"
    else
        log_error "解压失败"
        exit 1
    fi
    
    # 清理临时文件
    rm -f "$temp_zip"
}

# 设置权限和环境变量
setup_permissions_and_env() {
    log_info "设置执行权限..."
    
    # 设置执行权限
    if [ -f "$INSTALL_DIR/bin/pansftp" ]; then
        chmod +x "$INSTALL_DIR/bin/pansftp"
        log_success "设置执行权限完成"
    else
        log_warning "未找到bin/pansftp脚本"
    fi
    
    # 设置环境变量
    log_info "设置环境变量..."
    
    local shell_rc=""
    if [ -f "$HOME/.bashrc" ]; then
        shell_rc="$HOME/.bashrc"
    elif [ -f "$HOME/.zshrc" ]; then
        shell_rc="$HOME/.zshrc"
    fi
    
    if [ -n "$shell_rc" ]; then
        # 添加PATH变量
        if ! grep -q "export PATH=.*$INSTALL_DIR/bin" "$shell_rc"; then
            echo "export PATH=\"\$PATH:$INSTALL_DIR/bin\"" >> "$shell_rc"
            log_success "已添加PATH到 $shell_rc"
        else
            log_info "PATH已包含安装目录"
        fi
        
        # 添加PYTHONPATH变量
        if ! grep -q "export PYTHONPATH=.*$INSTALL_DIR" "$shell_rc"; then
            echo "export PYTHONPATH=\"\$PYTHONPATH:$INSTALL_DIR\"" >> "$shell_rc"
            log_success "已添加PYTHONPATH到 $shell_rc"
        fi
    else
        log_warning "未找到shell配置文件，无法自动设置环境变量"
    fi
}

# 创建安装信息记录脚本
create_post_install() {
    log_info "创建安装信息记录脚本..."
    
    local bin_dir="$INSTALL_DIR/bin"
    mkdir -p "$bin_dir"
    
    # 创建 post_install.sh 脚本
    cat > "$bin_dir/post_install.sh" << EOF
#!/bin/bash
# pansftp 安装信息配置
# 此文件由安装脚本自动生成，请勿手动修改

# 安装目录
export PANSFTP_INSTALL_DIR="$INSTALL_DIR"

# 虚拟环境目录
export PANSFTP_VENV_DIR="$INSTALL_DIR/venv"

# 安装完成时间
export PANSFTP_INSTALL_TIME="$(date +"%Y-%m-%d %H:%M:%S")"

# 加载虚拟环境函数
load_venv() {
    if [ -f "\$PANSFTP_VENV_DIR/bin/activate" ]; then
        source "\$PANSFTP_VENV_DIR/bin/activate"
        echo "已激活 pansftp 虚拟环境"
        return 0
    else
        echo "错误: 虚拟环境未找到在 \$PANSFTP_VENV_DIR"
        return 1
    fi
}

# 检查依赖函数
check_dependencies() {
    if ! command -v python3 &> /dev/null; then
        echo "错误: 未找到 Python 3"
        return 1
    fi
    
    if [ ! -f "\$PANSFTP_VENV_DIR/bin/activate" ]; then
        echo "错误: 虚拟环境未正确安装"
        return 1
    fi
    
    return 0
}

# 显示安装信息函数
show_install_info() {
    echo "pansftp 安装信息:"
    echo "  安装目录: \$PANSFTP_INSTALL_DIR"
    echo "  虚拟环境: \$PANSFTP_VENV_DIR"
    echo "  安装时间: \$PANSFTP_INSTALL_TIME"
}
EOF

    chmod +x "$bin_dir/post_install.sh"
    log_success "安装信息记录脚本已创建: $bin_dir/post_install.sh"
}

# 主函数
main() {
    log_info "开始安装 pansftp"
    log_info "项目地址: https://gitee.com/solomonxu/pansftp"
    
    # 检查环境
    check_environment
    
    # 检查Python
    if ! check_python; then
        log_warning "未找到合适的Python安装"
        read -p "是否自动安装Python? (Y/n): " install_python_choice
        if [[ "$install_python_choice" =~ ^[Nn]$ ]]; then
            log_info "请手动安装Python 3.7+后重新运行此脚本"
            exit 1
        else
            install_python
        fi
    fi
    
    # 设置安装目录
    DEFAULT_INSTALL_DIR="$HOME/pansftp"
    read -p "输入安装目录 (默认: $DEFAULT_INSTALL_DIR): " input_dir
    INSTALL_DIR=${input_dir:-$DEFAULT_INSTALL_DIR}
    
    # 下载和解压
    download_and_extract
    
    # 安装依赖
    install_dependencies
    
    # 设置权限和环境变量
    setup_permissions_and_env
	
	# 创建安装信息记录脚本
	create_post_install
    
    # 输出完成信息
    log_success "pansftp 安装完成!"
    echo ""
    log_info "运行方式:"
    echo "  1. 重新打开终端或运行: source ~/.bashrc (或对应shell的配置文件)"
    echo "  2. 直接执行: pansftp"
    echo ""
    log_info "或者直接运行: $INSTALL_DIR/bin/pansftp"
    echo ""
    log_info "安装目录: $INSTALL_DIR"
    echo ""
    log_info "如需卸载，只需删除安装目录并移除shell配置文件中相关环境变量"
}

# 运行主函数
main "$@"
